package com.ganzalang.gmall.command.service;

import com.ganzalang.gmall.command.api.dto.IncreaseInventoryDTO;
import com.ganzalang.gmall.command.api.dto.ProductVariantInventoryDTO;
import com.ganzalang.gmall.command.domain.ProductVariantInventory;

import java.util.List;

/**
 * @description: 商品库存表的服务接口
 * @author: ganziliang
 * @Date 2021/3/13 10:06
 */
public interface ProductVariantInventoryService {

    /**
     * 通过productId获取商品库存信息
     * @param shopId 店铺ID
     * @param productId 商品ID
     * @return
     */
    List<ProductVariantInventoryDTO> getProductInventoryByProductId(Long shopId, Long productId);

    /**
     * 更新数据库中的sku库存
     * @param shopId 店铺ID
     * @param productVariantInventories 商品库存DO对象列表
     * @return
     */
    Boolean updateInventoryToDB(Long shopId, List<ProductVariantInventory> productVariantInventories);

    /**
     * 获取sku的库存配置
     * @param shopId 店铺ID
     * @param productId spuId
     * @param variantId skuId
     * @return sku库存信息
     */
    ProductVariantInventoryDTO getVariantInventory(Long shopId, Long productId, Long variantId);

    /**
     * 预扣库存
     * @param shopId 店铺ID
     * @param productId spuId
     * @param variantId skuId
     * @param quantity 扣减数量
     * @return 是否成功
     */
    Boolean withholdingDecreaseInventory(Long shopId, Long productId, Long variantId, Integer quantity);

    /**
     * 批量撤销预扣库存
     * @param increaseInventoryDTOS 需要撤销的库存信息
     * @return 是否成功
     */
    Boolean rollbackWithholdingDecreaseInventory(List<IncreaseInventoryDTO> increaseInventoryDTOS);

    /**
     * 校验库存,不对库存做处理
     * @param shopId 店铺ID
     * @param productId spuId
     * @param variantId skuId
     * @param quantity 扣减数量
     * @return 是否成功扣除库存
     */
    Boolean verifyInventory(Long shopId, Long productId, Long variantId, Integer quantity);
}
